/*
 * ControllerListenerPopupJTree.java
 * Copyright 2010 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * 
 * Creado el 26/04/2010, 08:26:29 AM
 */
package com.ufps.cuatro.controlador.listener;

import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;

import javax.swing.ImageIcon;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
import javax.swing.JSeparator;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreePath;

import com.ufps.cuatro.CuatroApp;
import com.ufps.cuatro.controlador.render.UtilRender;
import com.ufps.cuatro.modelo.biblioteca.StaticListModelObject;
import com.ufps.cuatro.modelo.old.ComponenteBeans;
import com.ufps.cuatro.modelo.representacion.EventoOyente;
import com.ufps.cuatro.modelo.representacion.ModeloAsociado;
import com.ufps.cuatro.modelo.representacion.ObjetoTipoDatoReflexion;
import com.ufps.cuatro.modelo.representacion.Oyente;
import com.ufps.cuatro.modelo.representacion.UtilRepresentacion;
import com.ufps.cuatro.modelo.representacion.componente.Componente;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidor;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorContenedor;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorContenedorEspejo;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorContenedorLibre;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorExtra;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGenerador;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorClaseCompleja;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorEnum;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorMetodo;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorMetodoGetter;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorMetodoSetter;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorString;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorUnitario;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorGeneradorVinculador;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorIntegrador;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorIntegradorExtra;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorIntegradorMetodo;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorIntegradorSimple;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteDistribuidorModeloAsociado;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteGenerado;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteGeneradoInterno;
import com.ufps.cuatro.modelo.representacion.componente.ComponenteGeneradoSimple;
import com.ufps.cuatro.util.Bandera;
import com.ufps.cuatro.util.InformacionNodo;
import com.ufps.cuatro.util.TipoCaso;
import com.ufps.cuatro.util.Utileria;
import com.ufps.cuatro.util.base.ComponenteBase;
import com.ufps.cuatro.util.base.ComponenteBasePersonalizado;
import com.ufps.cuatro.util.base.ComponenteBaseStandar;
import com.ufps.cuatro.util.generadores.GeneradorComponentes;
import com.ufps.cuatro.util.generadores.worker.SwingWorkerPreview;
import com.ufps.cuatro.util.wizard.UtilWizard;
import com.ufps.cuatro.vistas.JDialogCrearComponenteManual;
import com.ufps.cuatro.vistas.codificacion.JInternalFrameAdministracionCodificacion;
import com.ufps.cuatro.vistas.layout.JPanelExplorerTreeView;
import com.ufps.cuatro.vistas.representacion.JDialogDistribuirComponentes;
import com.ufps.cuatro.vistas.representacion.JDialogImage;
import com.ufps.cuatro.vistas.representacion.JDialogList;
import com.ufps.cuatro.vistas.representacion.JDialogMenuContenedor;
import com.ufps.cuatro.vistas.representacion.JDialogPreviewSourceCode;
import com.ufps.cuatro.vistas.representacion.JDialogPropiedadesBeans;
import com.ufps.cuatro.vistas.representacion.JDialogPropiedadesComponente;
import com.ufps.cuatro.vistas.representacion.JDialogSeleccionComponente;
import com.ufps.cuatro.vistas.representacion.JDialogSeleccionPropiedadesClase;
import com.ufps.cuatro.vistas.representacion.JDialogSelectModelStaticObject;

/**
 * <i><b>ControllerListenerPopupJTree:</b></i><p>Gestiona los Menus emergentes en la aplicación.</p>
 * 
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 26/04/2010
 * @see MouseAdapter
 * @see Observer
 * 
 */
public class ControllerListenerPopupJTree extends MouseAdapter implements Observer{
    
    private JPopupMenu popup;
    private Object objSeleccionado;    
    private JTree objArbol;
    private Object objParent;
    /**
     * Contiene la referencia del Objeto Padre.
     */
    public static Object objView;

    /**
     * Constructor por Defecto.
     */
    public ControllerListenerPopupJTree() {
    }
    
    /**
     * Constructor que inicializa las refercnais de Control.
     * @param objParent Contenedor Padre.
     * @param objArbol Control que implementa el Menú.
     * @param objSeleccionado Objeto que puede implementar el Menú.
     */
    public ControllerListenerPopupJTree(Object objParent, JTree objArbol, Object objSeleccionado) {          
        this.objParent = objParent;
        this.objSeleccionado = objSeleccionado;         
        this.objArbol = objArbol;
        crearPopupMenu();
    }

    /**
     * Devuelve la Referencia del Arbol uqe implementa el Menú.
     * @return Referencia del Arbol uqe implementa el Menú.
     */
    public JTree getObjArbol() {
        return objArbol;
    }

    /**
     * Devuelve la Referecnia del Objeto Padre Contenedor del Control que Implementa le Menú.
     * @return Referecnia del Objeto Padre Contenedor del Control que Implementa le Menú.
     */
    public Object getObjParent() {
        return objParent;
    }    
    
    /**
     * Determina si el Objeto puede Implementar un Menú.
     * @param obj Objeto que puede Implementar un Menú.
     * @return boolean que determina si el Objeto puede Implementar un Menú.
     */
    public static boolean isValidObjectToMenu(Object obj){
        if(obj instanceof Componente){
            return true;
        }
        else if(obj instanceof ModeloAsociado){
            return true;
        }
        else if(obj instanceof ComponenteBeans){
            return true;
        }
        else if(obj instanceof ComponenteBase){
            return true;
        }
        else if(obj instanceof ObjetoTipoDatoReflexion){
            ObjetoTipoDatoReflexion objTipoDato = (ObjetoTipoDatoReflexion) obj;
            if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.ePrimitivo){            
                return true;
            }
            else if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.eJDKRegistrado){
                return true;
            }        
            else if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.eClaseMundo){
                return true;            
            }
            else return false;
        }
        else if(obj instanceof StaticListModelObject){
            return true;
        }
        return false;
    }   
    
    private void crearPopupMenu(){
        if(objSeleccionado instanceof Componente){
            crearPopupMenuComponente();
        }
//        else if(objSeleccionado instanceof ModeloAsociado){
//            crearPopupMenuModeloAsociado();        
//        }
        else if(objSeleccionado instanceof ComponenteBeans){
            crearPopupMenuComponenteBeans();        
        }
        else if(objSeleccionado instanceof ComponenteBase){
            crearPopupMenuComponenteBase();        
        }
        else if(objSeleccionado instanceof ObjetoTipoDatoReflexion){
            crearPopupMenuObjetoTipoDatoReflexion();        
        }
        else if(objSeleccionado instanceof StaticListModelObject){
            crearPopupStaticListModelObject();        
        }        
    }
    
    private void crearPopupStaticListModelObject(){
        popup = createPopupMenuStaticModelObject();
        popup.setLightWeightPopupEnabled(true);        
    }
    
    private void crearPopupMenuObjetoTipoDatoReflexion(){
        popup = createPopupMenuObjetoTipoDatoReflexion();
        popup.setLightWeightPopupEnabled(true);        
    }
    
    private void crearPopupMenuComponenteBase(){
        if(objSeleccionado instanceof ComponenteBaseStandar){
            
        }
        else if(objSeleccionado instanceof ComponenteBasePersonalizado){
            
        }
    }

    private void crearPopupMenuComponenteBeans() {
        this.popup = this.createPopupMenuComponenteBeans();
        this.popup.setLightWeightPopupEnabled(true);
    }

    private void crearPopupMenuModeloAsociado() {
        this.popup = this.createPopupMenuModeloAsociado();
        this.popup.setLightWeightPopupEnabled(true);
    }
    
    private void crearPopupMenuComponente(){
        if(objSeleccionado instanceof ComponenteGeneradoSimple){
            this.popup = this.createPopupMenuComponenteGenerado();
            this.popup.setLightWeightPopupEnabled(true);        
        }
        else if(objSeleccionado instanceof ComponenteGeneradoInterno){
            this.popup = this.createPopupMenuComponenteGeneradoInterno();
            this.popup.setLightWeightPopupEnabled(true);        
        }
        else if(objSeleccionado instanceof ComponenteDistribuidorExtra){
            this.popup = this.createPopupMenuComponenteExtra();
            this.popup.setLightWeightPopupEnabled(true);        
        }        
        else if(objSeleccionado instanceof ComponenteDistribuidorGeneradorUnitario){
            this.popup = this.createPopupMenuComponenteGenerador();
            this.popup.setLightWeightPopupEnabled(true);        
        }        
        else if(objSeleccionado instanceof ComponenteDistribuidorGeneradorString){
            this.popup = this.createPopupMenuComponenteGenerador();
            this.popup.setLightWeightPopupEnabled(true);        
        }
        else if(objSeleccionado instanceof ComponenteDistribuidorGeneradorEnum){
            this.popup = this.createPopupMenuComponenteGenerador();
            this.popup.setLightWeightPopupEnabled(true);        
        }
        else if(objSeleccionado instanceof ComponenteDistribuidorGeneradorVinculador){
            this.popup = this.createPopupMenuComponenteGenerador();
            this.popup.setLightWeightPopupEnabled(true);        
        }
        else if(objSeleccionado instanceof ComponenteDistribuidorGeneradorMetodo){
            this.popup = this.createPopupMenuComponenteGenerador();
            this.popup.setLightWeightPopupEnabled(true);        
        }
        else if(objSeleccionado instanceof ComponenteDistribuidorGeneradorClaseCompleja){
            this.popup = this.createPopupMenuComponenteGenerador();
            this.popup.setLightWeightPopupEnabled(true);        
        }        
        else if(objSeleccionado instanceof ComponenteDistribuidorIntegrador){
            this.popup = this.createPopupMenuComponenteIntegrador();
            this.popup.setLightWeightPopupEnabled(true);        
        }
        else if(objSeleccionado instanceof ComponenteDistribuidorContenedor){
            this.popup = this.createPopupMenuComponenteContenedor();
            this.popup.setLightWeightPopupEnabled(true);        
        }        
        else if(objSeleccionado instanceof ComponenteDistribuidorModeloAsociado){
            this.popup = this.createPopupMenuComponenteModeloAsociado();
            this.popup.setLightWeightPopupEnabled(true);        
        } 
    }

    @Override
    public void mousePressed(MouseEvent e) {
        maybeShowPopup(e);
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        maybeShowPopup(e);
    }

    private void maybeShowPopup(MouseEvent e) {
        try{
            if (e.isPopupTrigger()) {
                int x = e.getX();
                int y = e.getY();
                TreePath path = this.objArbol.getPathForLocation(x, y);
                if (path != null){
                    this.objArbol.setSelectionPath(path);
                    DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
                    Object nodeInfo = node.getUserObject();
                    InformacionNodo objNodo = (InformacionNodo) nodeInfo;
                    if(objNodo.getObjElemento() instanceof Componente){
                        mostrarPopupMenuComponente(path, e.getComponent(), objNodo.getObjElemento(), x, y);
                    }
                    else if(objNodo.getObjElemento() instanceof ModeloAsociado){
                        mostrarPopupMenuModeloAsociado(path, e.getComponent(), objNodo.getObjElemento(), x, y);                    
                    }
                    else if(objNodo.getObjElemento() instanceof ComponenteBeans){
                        mostrarPopupMenuComponenteBeans(path, e.getComponent(), objNodo.getObjElemento(), x, y);                    
                    }                
                    else if(objNodo.getObjElemento() instanceof ObjetoTipoDatoReflexion){
                        mostrarPopupMenuObjetoTipoDatoReflexion(path, e.getComponent(), objNodo.getObjElemento(), x, y);                    
                    }
                    else if(objNodo.getObjElemento() instanceof StaticListModelObject){
                        mostrarPopupMenuStaticListModelObject(path, e.getComponent(), objNodo.getObjElemento(), x, y);                    
                    }
                }            
            }                
        }
        catch(java.lang.NullPointerException ex){
            UtilRender.printlnConsole(ex.getMessage(), UtilRender.ACTION_ERROR, true);
        }
    }
    
    private void mostrarPopupMenuStaticListModelObject(TreePath path, Component objComponent, Object objElemento, int x, int y){                
        this.objSeleccionado = objElemento;
        if(popup == null){
            this.crearPopupMenu();
        }
        System.out.println(path);
        popup.show(objComponent, x, y);
    }
    
    private void mostrarPopupMenuObjetoTipoDatoReflexion(TreePath path, Component objComponent, Object objElemento, int x, int y){                
        this.objSeleccionado = objElemento;
        if(popup == null){
            this.crearPopupMenu();
        }
        System.out.println(path);
        popup.show(objComponent, x, y);
    }
    
    private void mostrarPopupMenuModeloAsociado(TreePath path, Component objComponent, Object objElemento, int x, int y){                
        this.objSeleccionado = objElemento;
        if(popup == null){
            this.crearPopupMenu();
        }
        System.out.println(path);
        popup.show(objComponent, x, y);
    }
    
    private void mostrarPopupMenuComponenteBeans(TreePath path, Component objComponent, Object objElemento, int x, int y){                
        this.objSeleccionado = objElemento;
        if(popup == null){
            this.crearPopupMenu();
        }
        System.out.println(path);
        popup.show(objComponent, x, y);
    }
    
    private void mostrarPopupMenuComponente(TreePath path, Component objComponent, Object objElemento, int x, int y){        
        this.objSeleccionado = objElemento;
        if(popup == null){
            this.crearPopupMenu();
        }                    
        if(objElemento instanceof ComponenteDistribuidorContenedorEspejo){
            System.out.println(path);
            popup.show(objComponent, x, y);
        }
        else if(objElemento instanceof ComponenteDistribuidorContenedorLibre){
            System.out.println(path);
            popup.show(objComponent, x, y);
        }
        else if(objElemento instanceof ComponenteDistribuidorIntegradorMetodo){
            System.out.println(path);
            popup.show(objComponent, x, y);
        }
        else if(objElemento instanceof ComponenteDistribuidorIntegradorSimple){
            System.out.println(path);
            popup.show(objComponent, x, y);
        }
        else if(objElemento instanceof ComponenteDistribuidorIntegradorExtra){
            System.out.println(path);
            popup.show(objComponent, x, y);
        }
        else if(objElemento instanceof ComponenteDistribuidorGeneradorClaseCompleja){
            System.out.println(path);
            popup.show(objComponent, x, y);
        }
        else if(objElemento instanceof ComponenteDistribuidorGeneradorMetodoSetter){
            System.out.println(path);
            popup.show(objComponent, x, y);
        }
        else if(objElemento instanceof ComponenteDistribuidorGeneradorMetodoGetter){
            System.out.println(path);
            popup.show(objComponent, x, y);
        }
        else if(objElemento instanceof ComponenteDistribuidorGeneradorUnitario){
            System.out.println(path);
            popup.show(objComponent, x, y);
        }
        else if(objElemento instanceof ComponenteDistribuidorGeneradorString){
            System.out.println(path);
            popup.show(objComponent, x, y);
        }
        else if(objElemento instanceof ComponenteDistribuidorGeneradorEnum){
            System.out.println(path);
            popup.show(objComponent, x, y);
        }
        else if(objElemento instanceof ComponenteDistribuidorGeneradorVinculador){
            System.out.println(path);
            popup.show(objComponent, x, y);
        }
        else if(objElemento instanceof ComponenteDistribuidorExtra){
            System.out.println(path);
            popup.show(objComponent, x, y);
        }
        else if(objElemento instanceof ComponenteGeneradoInterno){
            System.out.println(path);
            popup.show(objComponent, x, y);
        }
        else if(objElemento instanceof ComponenteGeneradoSimple){
            System.out.println(path);
            popup.show(objComponent, x, y);
        }
        else if(objElemento instanceof ComponenteDistribuidorModeloAsociado){
            System.out.println(path);
            popup.show(objComponent, x, y);
        }
    }
    

    /**
     * Devuelve la Referecnia del Objeto que Implementar el Menú.
     * @return Referecnia del Objeto que Implementar el Menú.
     */
    public Object getObj() {
        return objSeleccionado;
    }

    /**
     * Devuelve el Menú emergente implementado en el contexto actual.
     * @return Menú emergente implementado en el contexto actual.
     */
    public JPopupMenu getPopup() {
        return popup;
    }    
    
    /**
     * Devuelve el Menú emergente implementado en un Componente Distribuidor Generador.
     * @return Menú emergente implementado en un Componente Distribuidor Generador.
     */
    private JPopupMenu createPopupMenuComponenteGenerador(){
        //Create the popup menu.
        JPopupMenu objPopup = new JPopupMenu();        
        //objPopup.addSourceCode(createPopupItemMenuEliminar());                
        objPopup.add(createPopupItemMenuVistaPrevia());        
        objPopup.add(createSeparador());
        if(objSeleccionado instanceof ComponenteDistribuidorGeneradorClaseCompleja){
            //objPopup.addSourceCode(createPopupItemMenuPropiedades());
            //objPopup.addSourceCode(createPopupMenuEventos());
            //objPopup.addSourceCode(createSeparador());        
            objPopup.add(createPopupItemMenuDistribuir());
            objPopup.add(createSeparador());
            objPopup.add(createPopupItemMenuVistaCodigoComponente());
            objPopup.add(createPopupItemMenuActualizarTitulo());  
            objPopup.add(createSeparador());
            objPopup.add(createPopupMenuPane()); 
        }
        else{
            if(objSeleccionado instanceof ComponenteDistribuidorGeneradorUnitario){
                ComponenteDistribuidorGeneradorUnitario objComponente = (ComponenteDistribuidorGeneradorUnitario) objSeleccionado;
                ObjetoTipoDatoReflexion objTipoDato = objComponente.getObjTipoDato();
                if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.ePrimitivo){                    
                }
//                else if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.eJDKRegistrado){
//                    if("String".equals(objTipoDato.getObjClass().getSimpleName())){
//                        ComponenteGeneradoInterno objComponenteGeneradoInterno = objComponente.getObjComponenteGenerador();
//                        if(objComponenteGeneradoInterno.getObjClassSwing().getSimpleName().equals("JList") ||
//                                objComponenteGeneradoInterno.getObjClassSwing().getSimpleName().equals("JComboBox")){
//                            objPopup.add(createSeparador());
//                            objPopup.add(createPopupItemMenuLinkModelStaticObject());
//                        }                        
//                    }                    
//                }
                else{
                    //objPopup.addSourceCode(createPopupItemMenuPropiedades());
                    //objPopup.addSourceCode(createPopupMenuEventos());
                    //objPopup.addSourceCode(createSeparador());        
                    //objPopup.addSourceCode(createPopupItemMenuDistribuir());                                
                }                
            }            
            else if(objSeleccionado instanceof ComponenteDistribuidorGeneradorString){
                ComponenteDistribuidorGeneradorString objComponente = (ComponenteDistribuidorGeneradorString) objSeleccionado;
                ObjetoTipoDatoReflexion objTipoDato = objComponente.getObjTipoDato();
                if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.ePrimitivo){                    
                }
                else{
                    //objPopup.addSourceCode(createPopupItemMenuPropiedades());
                    //objPopup.addSourceCode(createPopupMenuEventos());
                    //objPopup.addSourceCode(createSeparador());        
                    //objPopup.addSourceCode(createPopupItemMenuDistribuir());                                
                }                
            }
        }        
        objPopup.add(createPopupItemMenuCambiarNombre());        
        objPopup.add(createSeparador());
        objPopup.add(createPopupItemMenuIncluido((ComponenteDistribuidor)objSeleccionado));
        return objPopup;
    }
    
    /**
     * Devuelve el Menú emergente implementado en un Componente Distribuidor Contenedor.
     * @return Menú emergente implementado en un Componente Distribuidor Contenedor.
     */
    private JPopupMenu createPopupMenuComponenteContenedor(){
        //Create the popup menu.
        JPopupMenu objPopup = new JPopupMenu();
        //objPopup.addSourceCode(createPopupItemMenuPropiedades());
        //objPopup.addSourceCode(createPopupMenuEventos());
        //objPopup.addSourceCode(createSeparador());
        objPopup.add(createPopupItemMenuDistribuir());
        //objPopup.addSourceCode(createPopupItemMenuEliminar());
        objPopup.add(createSeparador());
        objPopup.add(createPopupItemMenuVistaCodigoComponente());
        objPopup.add(createPopupItemMenuVistaPrevia());
        objPopup.add(createSeparador());
        objPopup.add(createPopupItemMenuActualizarTitulo()); 
        objPopup.add(createPopupItemMenuCambiarNombre()); 
        objPopup.add(createSeparador());
        objPopup.add(createPopupMenuPlantillaCodigoFuente());        
        objPopup.add(createSeparador());
        objPopup.add(createPopupMenuPane()); 
        objPopup.add(createSeparador());
        objPopup.add(createPopupItemMenuIncluido((ComponenteDistribuidor)objSeleccionado));
        return objPopup;
    }
    
    /**
     * Devuelve el Menú emergente implementado en un Componente Distribuidor Modelo Asociado.
     * @return Menú emergente implementado en un Componente Distribuidor Modelo Asociado.
     */
    private JPopupMenu createPopupMenuComponenteModeloAsociado(){
        //Create the popup menu.
        JPopupMenu objPopup = new JPopupMenu();
        objPopup.add(createPopupItemMenuCambiarComponenteModeloAsociado());
        objPopup.add(createSeparador());
        objPopup.add(createPopupItemMenuVistaCodigoComponente());
        objPopup.add(createPopupItemMenuVistaPrevia());
        objPopup.add(createSeparador());
        objPopup.add(createPopupItemMenuActualizarTitulo());
        objPopup.add(createPopupItemMenuCambiarNombre()); 
        objPopup.add(createSeparador());
        objPopup.add(createPopupItemMenuIncluido((ComponenteDistribuidor)objSeleccionado));
        return objPopup;
    }
    
    /**
     * Devuelve el Menú emergente implementado en un Componente Distribuidor Integrador.
     * @return Menú emergente implementado en un Componente Distribuidor Integrador.
     */
    private JPopupMenu createPopupMenuComponenteIntegrador(){
        //Create the popup menu.
        JPopupMenu objPopup = new JPopupMenu();
        //objPopup.addSourceCode(createPopupItemMenuPropiedades());
        //objPopup.addSourceCode(createPopupMenuEventos());
        //objPopup.addSourceCode(createSeparador());
        objPopup.add(createPopupItemMenuDistribuir());
        objPopup.add(createSeparador());
        objPopup.add(createPopupItemMenuVistaCodigoComponente());
        objPopup.add(createPopupItemMenuVistaPrevia());
        //objPopup.addSourceCode(createPopupItemMenuEliminar());
        objPopup.add(createSeparador());
        objPopup.add(createPopupItemMenuActualizarTitulo());        
        objPopup.add(createPopupItemMenuCambiarNombre()); 
        objPopup.add(createSeparador());
        objPopup.add(createPopupMenuPane());
        objPopup.add(createSeparador());
        objPopup.add(createPopupItemMenuIncluido((ComponenteDistribuidor)objSeleccionado));
        return objPopup;
    }
    
    /**
     * Devuelve el Menú emergente implementado en un Componente Distribuidor Extra.
     * @return Menú emergente implementado en un Componente Distribuidor Extra.
     * @deprecated Este método ha sido descontinuado por que ya se utilizan representaciones sin
     * referecnias de tipos.
     */
    private JPopupMenu createPopupMenuComponenteExtra(){
        //Create the popup menu.
        JPopupMenu objPopup = new JPopupMenu();
        //objPopup.addSourceCode(createPopupItemMenuPropiedades());
        //objPopup.addSourceCode(createPopupMenuEventos());
        objPopup.add(createSeparador());
        objPopup.add(createPopupItemMenuDistribuir());
        objPopup.add(createSeparador());
        objPopup.add(createPopupItemMenuVistaCodigoComponente());
        objPopup.add(createPopupItemMenuVistaPrevia());
        objPopup.add(createSeparador());
        objPopup.add(createPopupItemMenuIncluido((ComponenteDistribuidor)objSeleccionado));
        //popup.addSourceCode(createPopupItemMenuEliminar());
        return objPopup;
    }
    
    /**
     * Devuelve el Menú emergente implementado en un Componente Generado.
     * @return Menú emergente implementado en un Componente Generado.
     */
    private JPopupMenu createPopupMenuComponenteGenerado(){
        //Create the popup menu.
        JPopupMenu objPopup = new JPopupMenu();
        objPopup.add(createPopupItemMenuPropiedades());
        objPopup.add(createPopupMenuEventos());                
        Componente objComponente = (Componente) objSeleccionado;
        if(objComponente.getObjClassSwing().getSimpleName().equals("JList") ||
                objComponente.getObjClassSwing().getSimpleName().equals("JComboBox")){
            objPopup.add(createSeparador());
            objPopup.add(createPopupItemMenuLinkModelStaticObject());
        }        
        return objPopup;
    }
    
    /**
     * Devuelve el Menú emergente implementado en un Componente Distribuidor.
     * @return Menú emergente implementado en un Componente Generado.
     */
    private JPopupMenu createPopupMenuPaneComponenteDistribuidor(){
        //Create the popup menu.
        JPopupMenu objPopup = new JPopupMenu();
        objPopup.add(createPopupItemMenuPropiedades());
        objPopup.add(createPopupMenuEventos());                        
        objPopup.add(createSeparador());
        objPopup.add(createPopupMenuPane());        
        objPopup.add(createSeparador());
        objPopup.add(createPopupItemMenuIncluido((ComponenteDistribuidor)objSeleccionado));
        return objPopup;
    }
    
    /**
     * Devuelve el Menú emergente implementado en un Componente Generado Interno.
     * @return Menú emergente implementado en un Componente Generado Interno.
     */
    private JPopupMenu createPopupMenuComponenteGeneradoInterno(){
        //Create the popup menu.
        JPopupMenu objPopup = new JPopupMenu();
        objPopup.add(createPopupItemMenuPropiedades());
        objPopup.add(createPopupMenuEventos());
        
        ComponenteGeneradoInterno objComponente = (ComponenteGeneradoInterno) (Componente) objSeleccionado;
        if(objComponente.getObjClassSwing().getSimpleName().equals("JList") ||
                objComponente.getObjClassSwing().getSimpleName().equals("JComboBox") &&
                "String".equals(objComponente.getSimpleNameTipoDato())){
            objPopup.add(createSeparador());
            objPopup.add(createPopupItemMenuLinkModelStaticObject());
        } 
        return objPopup;
    }
    
    private JPopupMenu createPopupMenuModeloAsociado(){
        //Create the popup menu.
        JPopupMenu objPopup = new JPopupMenu();
        objPopup.add(createPopupItemMenuRenombrarModeloAsociado());
        return objPopup;
    }
    
    private JPopupMenu createPopupMenuComponenteBeans(){
        //Create the popup menu.
        JPopupMenu objPopup = new JPopupMenu();
        objPopup.add(createPopupItemMenuRenombrarComponenteBeans());
        objPopup.add(createSeparador());
        objPopup.add(createPopupItemMenuPropiedadesComponenteBeans());
        objPopup.add(createSeparador());
        objPopup.add(createPopupItemMenuVistaCodigoBeans());
        return objPopup;
    }
    
    private JPopupMenu createPopupMenuStaticModelObject(){
        //Create the popup menu.
        JPopupMenu objPopup = new JPopupMenu();
        objPopup.add(createPopupItemMenuEditModelStaticObject());        
        return objPopup;
    }
    
    private JPopupMenu createPopupMenuObjetoTipoDatoReflexion(){
        //Create the popup menu.
        JPopupMenu objPopup = new JPopupMenu();
        final ObjetoTipoDatoReflexion objTipoDato = (ObjetoTipoDatoReflexion) objSeleccionado;
        if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.eClaseMundo){
            JMenuItem menu = new JMenuItem("Asistente para Representación por Panel");
                menu.addActionListener(new java.awt.event.ActionListener() {
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                        if(UtilWizard.runWizard(UtilWizard.WIZARD_CLASS, objTipoDato) == 0){   
                            ComponenteDistribuidorGeneradorClaseCompleja obj = GeneradorComponentes.construirComponenteGeneradorClaseCompleja(UtilWizard.objTempSwap);
                            if(UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesGeneradores().contains(obj)){
                                int i = UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesGeneradores().indexOf(obj);
                                UtilRepresentacion.objBibliotecaTrabajoLocal.set(i, obj);            
                                UtilRender.objJPanelExplorerTreeViewLibrary.reloadTreeView();
                                UtilRender.msgInformacion("Panel Actualizado Correctamente.");
                            }
                            else{
                                UtilRepresentacion.objBibliotecaTrabajoLocal.add(obj);
                                UtilRender.objJPanelExplorerTreeViewLibrary.reloadTreeView();
                                UtilRender.msgInformacion("Panel Generado Correctamente.");
                            } 
                            if(ControllerListenerPopupJTree.objView instanceof JInternalFrameAdministracionCodificacion){
                                Bandera objBanderaView = new Bandera();
                                objBanderaView.addObserver((Observer)ControllerListenerPopupJTree.objView);
                                objBanderaView.setObj(obj);
                                objBanderaView.setEstado(Bandera.COMPONENTE_GENERADOR_CREADO);
                                objBanderaView.notificar();
                            }
                        }
                    }
            });                 
            objPopup.add(menu);
            objPopup.add(createSeparador());    
            menu = new JMenuItem("Asistente para Representación Simplificada");
                menu.addActionListener(new java.awt.event.ActionListener() {
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                        if(UtilWizard.runWizard(UtilWizard.WIZARD_CLASS_SIMPLE, objTipoDato) == 0){   
                            ComponenteDistribuidorGeneradorString obj = GeneradorComponentes.construirComponenteGeneradorString(UtilWizard.objTempSwap);
                            if(UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesGeneradores().contains(obj)){
                                int i = UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesGeneradores().indexOf(obj);
                                UtilRepresentacion.objBibliotecaTrabajoLocal.set(i, obj);            
                                UtilRender.objJPanelExplorerTreeViewLibrary.reloadTreeView();
                                UtilRender.msgInformacion("Vista Simplificada Actualizada Correctamente.");
                            }
                            else{
                                UtilRepresentacion.objBibliotecaTrabajoLocal.add(obj);
                                UtilRender.objJPanelExplorerTreeViewLibrary.reloadTreeView();
                                UtilRender.msgInformacion("Vista Simplificada Generada Correctamente.");
                            } 
                        }
                    }
            });                           
            objPopup.add(menu);
            menu = new JMenuItem("Asistente para Representación Vinculada");
                menu.addActionListener(new java.awt.event.ActionListener() {
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                        if(UtilWizard.runWizard(UtilWizard.WIZARD_GENERADOR_VINCULADOR, objTipoDato) == 0){   
                            ComponenteDistribuidorGeneradorVinculador obj = GeneradorComponentes.construirComponenteGeneradorVinculador(UtilWizard.objTempSwap);
                            if(UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesGeneradores().contains(obj)){
                                int i = UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesGeneradores().indexOf(obj);
                                UtilRepresentacion.objBibliotecaTrabajoLocal.set(i, obj);            
                                UtilRender.objJPanelExplorerTreeViewLibrary.reloadTreeView();
                                UtilRender.msgInformacion("Vista Vinculada Actualizada Correctamente.");
                            }
                            else{
                                UtilRepresentacion.objBibliotecaTrabajoLocal.add(obj);
                                UtilRender.objJPanelExplorerTreeViewLibrary.reloadTreeView();
                                UtilRender.msgInformacion("Vista Vinculada Generada Correctamente.");
                            } 
                        }
                    }
            });                           
            objPopup.add(menu);
            
        }
        else{
            objPopup.add(createPopupItemMenuGenerarRepresentacion((ObjetoTipoDatoReflexion) objSeleccionado));
        }           
        return objPopup;
    }
    
    private void verPropiedades(java.awt.event.ActionEvent evt){        
        if(objSeleccionado instanceof Componente){
            JFrame mainFrame = Utileria.objFrame;
            JDialogPropiedadesComponente objDialogPropiedadesComponente;            
            objDialogPropiedadesComponente = new JDialogPropiedadesComponente(
                    this, (Componente) this.objSeleccionado);
            objDialogPropiedadesComponente.setLocationRelativeTo(mainFrame);        
            CuatroApp.getApplication().show(objDialogPropiedadesComponente);                
        }
        else{
            UtilRender.msgInformacion("El Objeto Seleccionado no Presenta Propiedades Disponibles.");
        }        
    }
    
    private JMenuItem createPopupItemMenuLinkModelStaticObject(){
        JMenuItem menuItem;        
        menuItem = new JMenuItem("Vincular Modelo Estático");
        menuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                vincularModelStatic();
            }
        });
        return menuItem;
    }
    
    private void vincularModelStatic(){        
        if(objSeleccionado instanceof ComponenteGenerado){
            JFrame mainFrame;
            JDialogSelectModelStaticObject objDialogListModel;
            mainFrame = Utileria.objFrame;
            objDialogListModel = new JDialogSelectModelStaticObject(this, (ComponenteGenerado) this.objSeleccionado);
            objDialogListModel.setLocationRelativeTo(mainFrame);        
            CuatroApp.getApplication().show(objDialogListModel);                
        }
        else{
            Utileria.mostrarMensaje(Utileria.objFrame, 
                        "El Objeto Seleccionado no Permite la Vinculación de Modelos.", 
                        "", 
                        JOptionPane.WARNING_MESSAGE);
        }        
    }
    
    private JMenuItem createPopupMenuPane(){
        JMenuItem menuItem;        
        menuItem = new JMenuItem("Vincular Menu Opciones");
        menuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                vincularMenuPane();
            }
        });
        return menuItem;
    }
    
    private void vincularMenuPane(){        
        if(objSeleccionado instanceof ComponenteDistribuidorGeneradorClaseCompleja ||
                objSeleccionado instanceof ComponenteDistribuidorIntegrador ||
                objSeleccionado instanceof ComponenteDistribuidorContenedor){
            JFrame mainFrame;
            JDialogMenuContenedor objDialogMenu;
            mainFrame = Utileria.objFrame;
            objDialogMenu = new JDialogMenuContenedor(this, (ComponenteDistribuidor) this.objSeleccionado);
            objDialogMenu.setLocationRelativeTo(mainFrame);        
            CuatroApp.getApplication().show(objDialogMenu);                
        }
        else{
            Utileria.mostrarMensaje(Utileria.objFrame, 
                        "El Objeto Seleccionado no Permite la Creación de Menu.", 
                        "", 
                        JOptionPane.WARNING_MESSAGE);
        }        
    }
    
    private JMenuItem createPopupItemMenuEditModelStaticObject(){
        JMenuItem menuItem;        
        menuItem = new JMenuItem("Editar Modelo");
        menuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                editarModelStatic();
            }
        });
        return menuItem;
    }
    
    private void editarModelStatic(){        
        if(objSeleccionado instanceof StaticListModelObject){
            JFrame mainFrame;
            JDialogList objDialogListModel;
            mainFrame = Utileria.objFrame;
            objDialogListModel = new JDialogList(this, (StaticListModelObject) this.objSeleccionado);
            objDialogListModel.setLocationRelativeTo(mainFrame);        
            CuatroApp.getApplication().show(objDialogListModel);                
        }
        else{
            Utileria.mostrarMensaje(Utileria.objFrame, 
                        "El Objeto Seleccionado no Permite la Edición de Modelos.", 
                        "", 
                        JOptionPane.WARNING_MESSAGE);
        }        
    }
    
    private JMenuItem createPopupItemMenuPropiedades(){
        JMenuItem menuItem;        
        menuItem = new JMenuItem("Propiedades");
        menuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                verPropiedades(evt);
            }
        });
        return menuItem;
    }
    
    private JMenuItem createPopupItemMenuUpdateRecurso(){
        JMenuItem menuItem;     
        Componente objComponente = (Componente) objSeleccionado;
        if(objComponente.getObjClassSwing().getSimpleName().equals("JLabel")){                        
            menuItem = new JMenuItem((objComponente.getObjConfig() == null) ? "Agregar Imagen" : "Actualizar Imagen");
            menuItem.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    vincularRecurso();
                }
            });            
        }
        else{
            menuItem = new JMenuItem("Recurso No Disponible");
        }
        return menuItem;
    }
    
    private JMenuItem createPopupItemMenuDelRecurso(){
        JMenuItem menuItem;     
        final Componente objComponente = (Componente) objSeleccionado;
        if(objComponente.getObjClassSwing().getSimpleName().equals("JLabel")){            
            menuItem = new JMenuItem("Eliminar Imagen");
            menuItem.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    if(UtilRender.msgConfirmar("¿Desea Eliminar el Recurso Asignado?")){
                        objComponente.setObjConfig(null);
                    }
                }
            });            
        }
        else{
            menuItem = new JMenuItem("Recurso No Disponible");
        }
        return menuItem;
    }
    
    private void vincularRecurso(){
        Componente objComponente = (Componente) objSeleccionado;
        if(objComponente.getObjClassSwing().getSimpleName().equals("JLabel")){  
            JDialogImage objDialog = new JDialogImage(objParent, (Componente)objSeleccionado);
            JFrame mainFrame = Utileria.objFrame;
            objDialog.setLocationRelativeTo(mainFrame);            
            objDialog.pack();
            objDialog.setVisible(true);
            //CuatroApp.getApplication().show(objDialog);
        }        
    }
    
    private JCheckBoxMenuItem createPopupItemMenuIncluido(final ComponenteDistribuidor objComponenteDistribuidor){
        JCheckBoxMenuItem menuItem;        
        menuItem = new JCheckBoxMenuItem("Incluir en Representación", objComponenteDistribuidor.isIncluido());
        menuItem.setToolTipText("La Inclusión se aplica a la Generación de Vistas Previas y Código Fuente.");
        menuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                JCheckBoxMenuItem menuItem = (JCheckBoxMenuItem) evt.getSource();        
                boolean incluido = menuItem.isSelected();
                ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objSeleccionado;
                if(!incluido && objComponenteDistribuidor instanceof ComponenteDistribuidorGenerador){
                    if((UtilRepresentacion.objBibliotecaTrabajoLocal.isIncludedInRepresentationModeloAsociado((ComponenteDistribuidorGenerador) objComponenteDistribuidor))){
                        UtilRender.msgAdvertencia("No puede quitar el Componente porque tiene una relación\n" +
                                "de dependencia en una Representación de un Modelo Asociado.\n" +
                                "Puede cambiarla pero no excluirla mientras esta relacionada.");
                    }
                    else if(!UtilRepresentacion.objBibliotecaTrabajoLocal.canExcludeInRepresentation((ComponenteDistribuidorGenerador) objComponenteDistribuidor)){
                        UtilRender.msgAdvertencia("No puede quitar el Componente porque tiene una relación\n" +
                                "de dependencia en una Representación.");
                    }
                    else{
                        objComponenteDistribuidor.setIncluido(incluido);
                        UtilRender.objJPanelExplorerTreeViewLibrary.updateTreeView();                                            
                    }
                }
                else{
                    objComponenteDistribuidor.setIncluido(incluido);
                    UtilRender.objJPanelExplorerTreeViewLibrary.updateTreeView();                    
                }
            }
        });
        return menuItem;
    }
    
    private JMenuItem createPopupItemMenuPropiedadesComponenteBeans(){
        JMenuItem menuItem;        
        menuItem = new JMenuItem("Propiedades");
        menuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                verPropiedadesComponenteBeans();
            }
        });
        return menuItem;
    }
    
    private JMenuItem createPopupItemMenuRenombrarComponenteBeans(){
        JMenuItem menuItem;        
        menuItem = new JMenuItem("Renombrar");
        menuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                renombrarComponenteBeans();
            }
        });
        return menuItem;
    }
    
    private JMenuItem createPopupItemMenuRenombrarModeloAsociado(){
        JMenuItem menuItem;        
        menuItem = new JMenuItem("Renombrar");
        menuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                renombrarModeloAsociado();
            }
        });
        return menuItem;
    }    
    
    private JMenuItem createPopupItemMenuActualizarTitulo(){
        JMenuItem menuItem;        
        menuItem = new JMenuItem("Actualizar Titulo");
        menuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                actualizarTituloPanel();
            }
        });
        return menuItem;
    }
    
    private JMenuItem createPopupItemMenuCambiarNombre(){
        JMenuItem menuItem;        
        menuItem = new JMenuItem("Cambiar Nombre");
        menuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cambiarNombre();
            }
        });
        return menuItem;
    }
    
    private JMenuItem createPopupItemMenuDistribuir(){
        JMenuItem menuItem;        
        menuItem = new JMenuItem("Distribuir");
        menuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {     
                administrarDistribucionComponentes();
            }            
        });
        return menuItem;
    }
    
    private void administrarDistribucionComponentes() {
        JDialogDistribuirComponentes objDialog = new JDialogDistribuirComponentes(objParent, (Componente)objSeleccionado);
        JFrame mainFrame = Utileria.objFrame;
        objDialog.setLocationRelativeTo(mainFrame);
        //objDialog.setSize(Toolkit.getDefaultToolkit().getScreenSize());    
        objDialog.pack();
        objDialog.setVisible(true);
        //CuatroApp.getApplication().show(objDialog);
    }
    
    private JMenuItem createPopupItemMenuEliminar(){
        JMenuItem menuItem;        
        menuItem = new JMenuItem("Eliminar");
        menuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {                
            }
        });
        return menuItem;
    }
    
    private JMenuItem createPopupItemMenuCambiarComponenteModeloAsociado(){
        JMenuItem menuItem;        
        menuItem = new JMenuItem("Reemplazar Representación del Modelo Asociado");
        menuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {                
                cambiarComponenteModeloAsociado();
            }
        });
        return menuItem;
    }
    
    private JMenuItem createPopupItemMenuVistaCodigoComponente(){
        JMenuItem menuItem;        
        menuItem = new JMenuItem("Ver Código Fuente");
        menuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {                
                verCodigoFuenteComponente();
            }
        });
        return menuItem;
    }
    
    private JMenuItem createPopupItemMenuVistaCodigoBeans(){
        JMenuItem menuItem;        
        menuItem = new JMenuItem("Ver Código Fuente");
        menuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {                
                verCodigoFuenteComponente();
            }
        });
        return menuItem;
    }
    
    private JMenuItem createPopupItemMenuVistaPrevia(){
        JMenuItem menuItem;        
        menuItem = new JMenuItem("Vista Previa");
        menuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                vistaPrevia();
            }
        });
        return menuItem;
    }
    
    private JMenu createPopupItemMenuGenerarRepresentacion(ObjetoTipoDatoReflexion objTipoDato){
        JMenu menu;        
        menu = new JMenu("Generar Representación");
        if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.ePrimitivo){            
            menu = new JMenu("Generar Representación");
            menu.add(createPopupItemMenuGenerarRepresentacionManual());
            menu.add(createPopupItemMenuGenerarRepresentacionPatron());
        }
        else if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.eJDKRegistrado){
            menu = new JMenu("Generar Representación");
            menu.add(createPopupItemMenuGenerarRepresentacionManual());
            menu.add(createPopupItemMenuGenerarRepresentacionPatron());            
            menu.add(createSeparador());
            menu.add(createPopupItemVinculador(objTipoDato));                        
        }        
        return menu;
    }
    
    private JMenuItem createPopupItemVinculador(final ObjetoTipoDatoReflexion objTipoDato){
        JMenuItem menu = new JMenuItem("Asistente para Representación Vinculada");
        menu.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                if(UtilWizard.runWizard(UtilWizard.WIZARD_GENERADOR_VINCULADOR, objTipoDato) == 0){   
                    ComponenteDistribuidorGeneradorVinculador obj = GeneradorComponentes.construirComponenteGeneradorVinculador(UtilWizard.objTempSwap);
                    if(UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesGeneradores().contains(obj)){
                        int i = UtilRepresentacion.objBibliotecaTrabajoLocal.getObjComponentesGeneradores().indexOf(obj);
                        UtilRepresentacion.objBibliotecaTrabajoLocal.set(i, obj);            
                        UtilRender.objJPanelExplorerTreeViewLibrary.reloadTreeView();
                        UtilRender.msgInformacion("Vista Vinculada Actualizada Correctamente.");
                    }
                    else{
                        UtilRepresentacion.objBibliotecaTrabajoLocal.add(obj);
                        UtilRender.objJPanelExplorerTreeViewLibrary.reloadTreeView();
                        UtilRender.msgInformacion("Vista Vinculada Generada Correctamente.");
                    } 
                }
            }
        });                                       
        return menu;
    }
    
    private JMenuItem createPopupItemMenuGenerarRepresentacionManual(){
        JMenuItem menuItem;        
        menuItem = new JMenuItem("Manual");
        menuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ObjetoTipoDatoReflexion objTipoDato = (ObjetoTipoDatoReflexion) objSeleccionado;
                if(UtilRepresentacion.objBibliotecaTrabajoLocal.existeRepresentacionTipoDato(objTipoDato)){
                    if(!UtilRender.msgConfirmar("Existen Representaciones para el Tipo de Dato.\n" +
                            "¿Desea agregar otra Representación?"))
                    return;
                }
                if(objTipoDato.contieneRepresentacionesGenericas()){
                    if(!UtilRepresentacion.objBibliotecaTrabajoLocal.existeRepresentacionTiposDatoGenericos(objTipoDato.getObjTiposGenericos())){
                        UtilRender.msgAdvertencia("Las Representaciones Genericas del Tipo de Dato, aún no han sido definidas.\n" +
                                "Debe generarlas previamente para continuar.");
                        return;
                    }
                }                                
                generarRepresentacion(objTipoDato);
            }
        });
        return menuItem;
    }
    
    private JMenuItem createPopupItemMenuGenerarRepresentacionPatron(){
        JMenuItem menuItem;        
        menuItem = new JMenuItem("Automatica");
        menuItem.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                ObjetoTipoDatoReflexion objTipoDato = (ObjetoTipoDatoReflexion) objSeleccionado;
                if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.eJDKNoRegistrado){
                    UtilRender.msgInformacion("Representación No Soportada en este Contexto.");
                }
                if(UtilRepresentacion.objBibliotecaTrabajoLocal.existeRepresentacionTipoDato(objTipoDato)){
                    if(!UtilRender.msgConfirmar("Existen Representaciones para el Tipo de Dato.\n" +
                            "¿Desea agregar otra Representación?"))
                    return;
                }
                if(objTipoDato.contieneRepresentacionesGenericas()){
                    if(!UtilRepresentacion.objBibliotecaTrabajoLocal.existeRepresentacionTiposDatoGenericos(objTipoDato.getObjTiposGenericos())){
                        UtilRender.msgAdvertencia("Las Representaciones Genericas del Tipo de Dato, aún no han sido definidas.\n" +
                                "Debe generarlas previamente para continuar.");
                        return;
                    }
                }
                ComponenteDistribuidorGenerador objTempComponenteGenerador = 
                        GeneradorComponentes.generarRepresentacionPorTipoDato(objTipoDato, false, true);
                if(objTempComponenteGenerador != null){                    
                    Bandera objBandera = new Bandera();                                                   
                    objBandera.addObserver(UtilRender.objJPanelExplorerTreeViewLibrary);
                    objBandera.setEstado(Bandera.GENERADOR_SILENCIOSO_OK);                
                    objBandera.setFlag(true);
                    objBandera.setObj(objTempComponenteGenerador);
                    objBandera.notificar();       
                }
            }
        });
        return menuItem;
    }
    
    private JMenu createPopupMenuEventos(){
        JMenu menuOyentes = new JMenu("Eventos");
        if(this.objSeleccionado instanceof Componente){
            Componente objComponente = (Componente) this.objSeleccionado;
            for(Oyente objOyente : objComponente.getObjOyentes()){                
                ImageIcon icono = Utileria.leerRecursoImagen(Utileria.ICONO_OYENTE, 16);
                JLabel labelIcono = new JLabel(icono);
                JMenu menuEventos = new JMenu(objOyente.getStrNombre());
                menuEventos.setToolTipText(objOyente.getStrToolTips());                
                menuEventos.setIcon(labelIcono.getIcon());
                ArrayList<EventoOyente> objEventos = objOyente.getObjEventos();
                for(EventoOyente objEvento : objEventos){
                    icono = Utileria.leerRecursoImagen(Utileria.ICONO_EVENTO, 16);
                    labelIcono = new JLabel(icono);                
                    JCheckBoxMenuItem menuItemEvento = 
                            new JCheckBoxMenuItem(
                                objEvento.getStrAlias().isEmpty() ? objEvento.getStrNombre() : objEvento.getStrAlias(), 
                                labelIcono.getIcon(),
                                objEvento.isIncluido());
                    menuItemEvento.setToolTipText(objEvento.getStrTooltips());
                    menuItemEvento.setActionCommand(objEvento.getStrNombre());
                    menuItemEvento.addActionListener(new java.awt.event.ActionListener() {
                        public void actionPerformed(java.awt.event.ActionEvent evt) {
                            procesarClickCheckBoxMenuItemEvento(evt);
                        }
                    });
                    menuEventos.add(menuItemEvento);
                }
                menuOyentes.add(menuEventos);                
            }            
        }                
        return menuOyentes;     
    }
    
    private JMenu createPopupMenuPlantillaCodigoFuente(){
        JMenu menuPlantillas = new JMenu("Plantilla de Generación de Código");
        if(this.objSeleccionado instanceof ComponenteDistribuidorContenedor){
            ComponenteDistribuidorContenedor objComponente = (ComponenteDistribuidorContenedor) this.objSeleccionado;            
            ImageIcon icono = Utileria.leerRecursoImagen(Utileria.ICONO_IMG, 16);                            
            JCheckBoxMenuItem menuItemPlantilla = 
                    new JCheckBoxMenuItem(
                        "Usar Plantilla Pestañas", 
                        icono,
                        objComponente.plantilla_generacion_codigo_fuente == 0 ? false : true);
            menuItemPlantilla.setToolTipText("Utiliza la Plantilla de Formulario con Pestañas");
            menuItemPlantilla.setActionCommand("tab");
            menuItemPlantilla.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    procesarClickCheckBoxMenuItemPlantilla(evt);
                }
            });            
            menuPlantillas.add(menuItemPlantilla);
        }                
        return menuPlantillas;     
    }
    
    private JSeparator createSeparador(){
        return new JSeparator();
    } 
    
    private void vistaPrevia(){
        if(this.objSeleccionado instanceof ComponenteDistribuidor){
            preview();
        }
    }
    
    private void cambiarComponenteModeloAsociado(){        
        JDialogSeleccionComponente objVentana = new JDialogSeleccionComponente(this, (ComponenteDistribuidor) objSeleccionado, JDialogSeleccionComponente.SELECCION_COLECCION_OBJECT);
        objVentana.setLocationRelativeTo(Utileria.objFrame);
        CuatroApp.getApplication().show(objVentana);        
    }
    
    private void verCodigoFuenteComponente(){
        if(this.objSeleccionado instanceof ComponenteDistribuidor){
            JDialogPreviewSourceCode objVentana = new JDialogPreviewSourceCode((ComponenteDistribuidor) objSeleccionado);
            objVentana.setLocationRelativeTo(Utileria.objFrame);
            CuatroApp.getApplication().show(objVentana);
        }
        else if(this.objSeleccionado instanceof ComponenteBeans){
            JDialogPreviewSourceCode objVentana = new JDialogPreviewSourceCode((ComponenteBeans) objSeleccionado);        
            objVentana.setLocationRelativeTo(Utileria.objFrame);
            CuatroApp.getApplication().show(objVentana);
        }
    }
    
    private void renombrarModeloAsociado(){
        if(this.objSeleccionado instanceof ModeloAsociado){
            ModeloAsociado objModeloAsociado = (ModeloAsociado) this.objSeleccionado;
            String strName;
            strName = JOptionPane.showInputDialog(popup, "Ingrese un Nombre Válido para el Modelo Asociado:", Utileria.strTituloApp, JOptionPane.INFORMATION_MESSAGE);            
            if(Utileria.esIdentificadorJavaValido(strName)){
                objModeloAsociado.setStrName(strName);
                Bandera objBandera = new Bandera();
                objBandera.addObserver((Observer) objParent);
                objBandera.setEstado(Bandera.PROPIEDADES_ACTUALIZADAS);                
                objBandera.notificar();                          
            }
        }
    }
    
    private void actualizarTituloPanel(){
        if(this.objSeleccionado instanceof ComponenteDistribuidorGeneradorClaseCompleja ||
                this.objSeleccionado instanceof ComponenteDistribuidorModeloAsociado ||
                this.objSeleccionado instanceof ComponenteDistribuidorIntegrador ||
                this.objSeleccionado instanceof ComponenteDistribuidorContenedor){
            ComponenteDistribuidor objComponenteDistribuidor = (ComponenteDistribuidor) objSeleccionado;            
            String strTitulo = objComponenteDistribuidor.getStrTitulo();
            
            strTitulo = JOptionPane.showInputDialog(popup, 
                    "Ingrese el Titulo para el Contenedor: \n" + 
                    "Título Actual (<b><code>" + strTitulo + "</code></b>).", 
                    Utileria.strTituloApp, JOptionPane.INFORMATION_MESSAGE);            
            if(strTitulo != null){
                if(!strTitulo.isEmpty()){
                    objComponenteDistribuidor.setStrTitulo(strTitulo);
                    Bandera objBandera = new Bandera();
                    objBandera.addObserver((Observer) objParent);
                    objBandera.setEstado(Bandera.ACTUALIZACION_TITULO);                
                    objBandera.notificar();                          
                }
            }
        }
    }
    
    private void cambiarNombre(){
        if(this.objSeleccionado instanceof ComponenteDistribuidorGeneradorClaseCompleja ||
                this.objSeleccionado instanceof ComponenteDistribuidorGeneradorVinculador ||
                this.objSeleccionado instanceof ComponenteDistribuidorModeloAsociado ||
                this.objSeleccionado instanceof ComponenteDistribuidorIntegrador ||
                this.objSeleccionado instanceof ComponenteDistribuidorContenedor ||
                this.objSeleccionado instanceof ComponenteDistribuidorGeneradorUnitario ||
                this.objSeleccionado instanceof ComponenteDistribuidorGeneradorString ||
                this.objSeleccionado instanceof ComponenteDistribuidorGeneradorEnum ||
                this.objSeleccionado instanceof ComponenteGenerado){
            Componente objComponente = (Componente) objSeleccionado;            
            String strName = objComponente.getName();
            strName = JOptionPane.showInputDialog(popup, 
                    "Ingrese el Nuevo Nombre para el Componente: \n" + 
                    "Nombre Actual (<b><code>" + strName + "</code></b>)", 
                    Utileria.strTituloApp, JOptionPane.INFORMATION_MESSAGE);            
            if(Utileria.esIdentificadorJavaValido(strName)){
                objComponente.setName(strName);
                Bandera objBandera = new Bandera();
                objBandera.addObserver((Observer) objParent);
                objBandera.setEstado(Bandera.CAMBIAR_NOMBRE);                
                objBandera.notificar();                          
            }            
        }
    }
    
    private void renombrarComponenteBeans(){
        if(this.objSeleccionado instanceof ComponenteBeans){
            ComponenteBeans objComponenteBeans = (ComponenteBeans) this.objSeleccionado;
            String strName;
            strName = JOptionPane.showInputDialog(popup, "Ingrese un Nombre Válido para el Componente Beans:", Utileria.strTituloApp, JOptionPane.INFORMATION_MESSAGE);            
            if(Utileria.esIdentificadorJavaValido(strName)){
                objComponenteBeans.setStrName(strName);
                Bandera objBandera = new Bandera();
                objBandera.addObserver((Observer) objParent);
                objBandera.setEstado(Bandera.PROPIEDADES_ACTUALIZADAS);                
                objBandera.notificar();                          
            }
        }
    }
    
    private void verPropiedadesComponenteBeans(){
        if(this.objSeleccionado instanceof ComponenteBeans){
            ComponenteBeans objComponenteBeans = (ComponenteBeans) this.objSeleccionado;
            JDialogPropiedadesBeans objDialogo = new JDialogPropiedadesBeans(this, objComponenteBeans.getObjPropiedadesStaticSimpleBeans());
            objDialogo.setLocationRelativeTo(Utileria.objFrame);
            CuatroApp.getApplication().show(objDialogo);
        }
    }
    
    private void procesarClickCheckBoxMenuItemEvento(java.awt.event.ActionEvent evt){
        String strComando = evt.getActionCommand();
        if(this.objSeleccionado instanceof Componente){
            Componente objComponente = (Componente) this.objSeleccionado;
            ArrayList<Oyente<Componente>> objOyentes = objComponente.getObjOyentes();            
            for(Oyente<Componente> objOyente : objOyentes){
                int idOyente, idEvento; 
                ArrayList<EventoOyente> objEventos = objOyente.getObjEventos();
                idOyente = objOyentes.indexOf(objOyente);
                for(EventoOyente objEvento : objEventos){
                    if(objEvento.getStrNombre().equals(strComando)){
                        idEvento = objEventos.indexOf(objEvento);
                        JCheckBoxMenuItem menuItemEvento = (JCheckBoxMenuItem) evt.getSource();
                        objEvento.setIncluido(menuItemEvento.isSelected());
                        objEventos.set(idEvento, objEvento);
                        objOyentes.set(idOyente, objOyente);
                        objComponente.setObjOyentes(objOyentes);
                    }                    
                }                
            }
        }        
    }
    
    private void procesarClickCheckBoxMenuItemPlantilla(java.awt.event.ActionEvent evt){
        String strComando = evt.getActionCommand();
        if(this.objSeleccionado instanceof ComponenteDistribuidorContenedor){
            ComponenteDistribuidorContenedor objComponente = (ComponenteDistribuidorContenedor) this.objSeleccionado;            
            if(strComando.equals("tab")){                
                JCheckBoxMenuItem menuItemPlantilla = (JCheckBoxMenuItem) evt.getSource();
                objComponente.plantilla_generacion_codigo_fuente = menuItemPlantilla.isSelected() ? 1 : 0;
            }                                
        }        
    }

    public void update(Observable o, Object arg) {
        try{
            if(o instanceof Bandera){
                if(objParent instanceof JPanelExplorerTreeView){
                    JPanelExplorerTreeView objJPanelExplorerTreeView = (JPanelExplorerTreeView) objParent;
                    Bandera objBandera = (Bandera) o;
                    objBandera.deleteObservers();
                    switch(objJPanelExplorerTreeView.modo){
                        case JPanelExplorerTreeView.EXPLORER_TREE_CLASS:
                            objBandera.addObserver(UtilRender.objJPanelExplorerTreeViewClass);
                            break;
                        case JPanelExplorerTreeView.EXPLORER_TREE_LIBRARY:
                            objBandera.addObserver(UtilRender.objJPanelExplorerTreeViewLibrary);
                            break;
                        case JPanelExplorerTreeView.EXPLORER_TREE_PALETE:
                            objBandera.addObserver(UtilRender.objJPanelExplorerTreeViewPalete);
                            break;
                        case JPanelExplorerTreeView.EXPLORER_TREE_TYPE:
                            if(objBandera.getObj() instanceof Componente){
                                objBandera.addObserver(UtilRender.objJPanelExplorerTreeViewLibrary);
                            }
                            else if(objBandera.getEstado() == Bandera.SELECCION_PROPIEDADES_CLASE_REPRESENTACION){
                                objBandera.addObserver(UtilRender.objJPanelExplorerTreeViewLibrary);
                            }
                            else{
                                objBandera.addObserver(UtilRender.objJPanelExplorerTreeViewType);
                            }                        
                            break;
                        case JPanelExplorerTreeView.EXPLORER_TREE_STATIC_MODEL_LIST_OBJECT:
                            objBandera.addObserver(UtilRender.objJPanelExplorerTreeViewModels);
                            break;
                    }
                    objBandera.notificar();                
//                    if(objView instanceof JInternalFrameAdministracionCodificacion){
//                        Bandera objBanderaView = (Bandera) objBandera.clone();
//                        objBanderaView.addObserver((Observer)objView);
//                        objBanderaView.notificar();
//                    }
                }                
                else{
                    Bandera objBandera = (Bandera) o;
                    objBandera.deleteObservers();
                    objBandera.addObserver((Observer) objParent);                    
                    objBandera.notificar();
                }
            }       
        }catch(java.lang.NullPointerException ex){  
            UtilRender.printlnConsole(ex.getMessage(), UtilRender.ACTION_ERROR, true);
        }
    }
    
    private void preview(){
        SwingWorkerPreview objWorker = new SwingWorkerPreview((ComponenteDistribuidor)objSeleccionado);
        objWorker.execute();
    }   
    
    private void generarRepresentacion(ObjetoTipoDatoReflexion objTipoDato){  
        if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.ePrimitivo){            
            JFrame mainFrame;
            mainFrame = Utileria.objFrame;                
            JDialogCrearComponenteManual objDialogCrearComponente = new JDialogCrearComponenteManual(this, objTipoDato);
            objDialogCrearComponente.setLocationRelativeTo(mainFrame);                
            CuatroApp.getApplication().show(objDialogCrearComponente);
        }
        else if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.eJDKRegistrado){
            JFrame mainFrame;
            mainFrame = Utileria.objFrame;                
            JDialogCrearComponenteManual objDialogCrearComponente = new JDialogCrearComponenteManual(this, objTipoDato);
            objDialogCrearComponente.setLocationRelativeTo(mainFrame);                
            CuatroApp.getApplication().show(objDialogCrearComponente);
        }        
        else if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.eClaseMundo){
            JFrame mainFrame = Utileria.objFrame;
            JDialogSeleccionPropiedadesClase objDialog = new JDialogSeleccionPropiedadesClase(this);            
            objDialog.setLocationRelativeTo(mainFrame);        
            CuatroApp.getApplication().show(objDialog);             
        }        
        else if(objTipoDato.getObjCaso().geteCaso() == TipoCaso.eJDKNoRegistrado){
            UtilRender.msgInformacion("Representación No Soportada en este Contexto.");
        }
    }

    /**
     * Devuelve la Referencia del Objeto Seleccionado por el cuál se Implementa el Menú.
     * @return Referencia del Objeto Seleccionado por el cuál se Implementa el Menú.
     */
    public Object getObjSeleccionado() {
        return objSeleccionado;
    }       
}